﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Modelo;

namespace SIGEB.Prototipo.Vista.moduloDocumentos
{
    public partial class frm_autor : frm_ModuloBase
    {
        #region "constructores"

        public frm_autor(controlPrincipal cp):
            base(cp)
        {
            InitializeComponent();
            this.cp = cp;
            asignarUI(this.Controls);
            if (retorno != null)
            {
                retorno.objeto = "";
            }
        }

        #endregion

        #region "metodos"

        private void dgv_usuarios_SelectionChanged(object sender, EventArgs e)
        {
            actualiarActual();
        }

        private void actualiarActual()
        {
            datoActual = getSelected();
        }

        private autor getSelected()
        {
            try
            {
                dgv_autores.Rows[dgv_autores.SelectedCells[0].RowIndex].Selected = true;
                String code = dgv_autores.SelectedRows[0].Cells[0].Value.ToString();
                return buscarAutor(code);
            }
            catch
            {
                return null;
            }
        }

        private autor buscarAutor(string code)
        {
            foreach (autor act in datosActuales)
            {
                if (act.nombre == code)
                {
                    return act;
                }
            }
            return null;
        }

        public override void actualizar(object referencia, bibliotecaObservador.EventoActualizacion e)
        {
            int conj = (int)referencia;
            if (conj == conjuntoBase.CONJAUTORES)
            {
                cargarDatos();
                recargarDGV();
            }
        }

        public override void hacerVisible(object[] arg)
        {
            if (arg != null)
            {
                retorno = (objetoReturn)arg[0];
                if (retorno != null)
                {
                    retorno.objeto = "";
                }
            }
            limpiarCampos();
            cargarDatos();
            recargarDGV();
            
        }

        private void cargarDatos()
        {
            datosActuales = cp.ctrlAutores.obtenerAutores();
        }

        private void recargarDGV()
        {
            if (String.IsNullOrEmpty(txt_busqueda.Text))
            {
                llenarDGV(datosActuales);
            }
            else
            {
                llenarDGV(buscarAutorTexto(txt_busqueda.Text));
            }
        }

        private LinkedList<autor> buscarAutorTexto(string frase)
        {
            LinkedList<autor> lista = new LinkedList<autor>();
            if (datosActuales != null)
            {
                foreach (autor act in datosActuales)
                {
                    if (String1.contiene(act.nombre, frase))
                    {
                        lista.AddLast(act);
                    }
                }
            }
            return lista;
        }

        private void llenarDGV(LinkedList<autor> datos)
        {
            llenarColumnas();
            if (datos != null)
            {
                foreach (autor act in datos)
                {
                    dgv_autores.Rows.Add(act.nombre);
                }
            }
        }

        private void llenarColumnas()
        {
            dgv_autores.Columns.Clear();
            dgv_autores.Columns.Add("nombre", "nombre");
        }

        private void dgv_autores_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            devolverSeleccionado();
        }

        private void devolverSeleccionado()
        {
            if (datoActual != null&&retorno!=null)
            {
                retorno.objeto = datoActual.nombre;
                Close();
            }
        }

        private void txt_busqueda_TextChanged(object sender, EventArgs e)
        {
            recargarDGV();
        }

        private void agregarAutor()
        {
            if (cp.ctrlAutores.camposAutorValido(new autor(txt_nombre.Text)))
            {
                cp.ctrlAutores.agregarAutor(new autor(txt_nombre.Text));
                limpiarCampos();
            }
        }

        private void limpiarCampos()
        {
            txt_nombre.Text = "";
        }

        private void eliminarAutor()
        {
            if (datoActual != null)
            {
                cp.ctrlAutores.eliminarAutor(datoActual.nombre);
            }
        }

        private void btn_agregar_Click(object sender, EventArgs e)
        {
            agregarAutor();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            eliminarAutor();
        }

        #endregion

        #region "atributos"

        LinkedList<autor> datosActuales;
        autor datoActual;
        objetoReturn retorno;

        #endregion  

    }
}
